Node.js DNS Module

Node.js DNS

डीएनएस मॉड्यूल का परिचय

DNS (डोमेन नाम सिस्टम) मॉड्यूल Node.js में नाम रिज़ॉल्यूशन के लिए कार्यक्षमता प्रदान करता है।

यह दो महत्वपूर्ण एपीआई प्रदान करता है:

कॉलबैक-आधारित एपीआई

पारंपरिक Node.js शैली कॉलबैक फ़ंक्शन के साथ

वादा-आधारित एपीआई

dns.promises के माध्यम से आधुनिक async/प्रतीक्षा समर्थन

महत्वपूर्ण विशेषताएं:

💡नोट:

DNS मॉड्यूल दो अलग-अलग तरीकों से काम कर सकता है - ऑपरेटिंग मोड की सुविधाओं का उपयोग करना या सीधे नेटवर्क DNS क्वेरीज़ को निष्पादित करना।

यह प्रभावित करता है कि आपके एप्लिकेशन में होस्टनाम रिज़ॉल्यूशन कैसे काम करता है।

डीएनएस के साथ शुरुआत करना

किसी डोमेन का आईपी पता देखने के लिए DNS मॉड्यूल का उपयोग करने का एक त्वरित उदाहरण यहां दिया गया है:

बुनियादी डीएनएस लुकअप

const dns = require('dns');

// Look up a domain name
dns.lookup('example.com', (err, address, family) => {
  if (err) {
    console.error('Lookup error:', err);
    return;
  }
  console.log(`IP address: ${address}`);
  console.log(`IP version: IPv${family}`);
});

आयात करना और स्थापित करना

DNS मॉड्यूल का उपयोग करके, आप कॉलबैक या वादा-आधारित एपीआई का उपयोग कर सकते हैं और इसे अपने Node.js एप्लिकेशन में आयात कर सकते हैं:

कॉलबैक-आधारित एपीआई

// Import the DNS module
const dns = require('dns');

// Example usage
dns.lookup('example.com', (err, address, family) => {
  if (err) throw err;
  console.log(`Resolved: ${address} (IPv${family})`);
});

वादा-आधारित एपीआई (Node.js 10.0.0+)

// Import the promises API
const { promises: dns } = require('dns');
// Or: const dns = require('dns').promises;

// Example with async/await
async function lookupDomain(domain) {
  try {
    const address = await dns.lookup(domain);
    console.log(`Resolved: ${address.address} (IPv${address.family})`);
  } catch (err) {
    console.error('Lookup failed:', err);
  }
}

lookupDomain('example.com');

💡नोट:

प्रॉमिस-आधारित एपीआई को आम तौर पर नए कोड के लिए प्राथमिकता दी जाती है क्योंकि यह आधुनिक एसिंक/प्रतीक्षा विधियों के साथ बेहतर काम करता है और बेहतर त्रुटि प्रबंधन प्रदान करता है।

बुनियादी डीएनएस लुकअप

DNS मॉड्यूल डोमेन नाम और आईपी पते देखने के कई तरीके प्रदान करता है। सबसे आम कार्य हैं:

dns.lookup()

यह होस्टनामों को हल करने के लिए ऑपरेटिंग सिस्टम की कार्यक्षमता का उपयोग करता है

dns.resolve*()

DNS क्वेरीज़ को सीधे नाम सर्वर पर निष्पादित करता है

dns.reverse()

नीचे DNS लुकअप सक्षम करता है (आईपी से होस्टनाम)

डोमेन नामों को आईपी पतों में हल करना

const dns = require('dns');

// Callback-based API
dns.lookup('www.example.com', (err, address, family) => {
  if (err) throw err;
  console.log('IP address: %s', address);
  console.log('IP version: IPv%s', family);
});
const dns = require('dns').promises;

// Promise-based API
async function lookupExample() {
  try {
    const result = await dns.lookup('www.example.com');
    console.log('IP address:', result.address);
    console.log('IP version: IPv' + result.family);
  } catch (err) {
    console.error('Lookup failed:', err);
  }
}

lookupExample();

💡नोट:

dns.lookup() .

किसी डोमेन के लिए सभी आईपी पते देखना

const dns = require('dns');

// Get all IPv4 addresses
dns.resolve4('www.google.com', (err, addresses) => {
  if (err) throw err;

  console.log('IPv4 addresses:');
  addresses.forEach(address => {
    console.log(` ${address}`);
  });

  // Perform a reverse lookup on the first IP
  dns.reverse(addresses[0], (err, hostnames) => {
    if (err) throw err;

    console.log(`Reverse lookup for ${addresses[0]}:`);
    hostnames.forEach(hostname => {
      console.log(` ${hostname}`);
    });
  });
});

डीएनएस रिकॉर्ड प्रकार

DNS मॉड्यूल विभिन्न DNS रिकॉर्ड प्रकारों के लिए लुकअप का समर्थन करता है:

तरीका रिकॉर्ड प्रकार व्याख्या
resolve4() A IPv4 पते
resolve6() AAAA IPv6 पते
resolveMx() MX मेल विनिमय रिकार्ड
resolveTxt() TXT पाठ अभिलेख
resolveSrv() SRV सेवा अभिलेख
resolveNs() NS नाम सर्वर रिकॉर्ड
resolveCname() CNAME Canonical name records
resolveSoa() SOA Start of authority records
resolvePtr() PTR Pointer records
resolveNaptr() NAPTR Name authority pointer records
resolveAny() ANY Any records

उन्नत DNS फ़ंक्शन

1. कस्टम डीएनएस रिज़ॉल्यूशन

DNS लुकअप पर अधिक नियंत्रण के लिए विशिष्ट सेटिंग्स के साथ एक कस्टम DNS रिज़ॉल्वर बनाएं:

const dns = require('dns');

// Create a new resolver
const resolver = new dns.Resolver();

// Set custom server (Google's public DNS)
resolver.setServers(['8.8.8.8', '8.8.4.4']);

// Use the custom resolver
resolver.resolve4('www.example.com', (err, addresses) => {
  if (err) throw err;

  console.log('Addresses resolved using Google DNS:');
  addresses.forEach(addr => {
    console.log(` ${addr}`);
  });
});

// See what servers are configured
console.log('Current resolver servers:', resolver.getServers());

💡नोट:

कस्टम रिज़ॉल्वर बनाना तब उपयोगी होता है जब आप सिस्टम के डिफ़ॉल्ट के बजाय विशिष्ट DNS सर्वर का उपयोग करना चाहते हैं, या जब विभिन्न लुकअप के लिए अलग-अलग सेटिंग्स की आवश्यकता होती है।

2. नेटवर्क बनाम परिचालन स्थिति निर्धारण

DNS मॉड्यूल नाम रिज़ॉल्यूशन के लिए दो अलग-अलग दृष्टिकोण प्रदान करता है:

समारोह कार्यान्वयन नेटवर्क कॉल का उपयोग करते हुए
dns.lookup() getaddrinfo() सिस्टम कॉल का उपयोग करता है कोई सीधा नेटवर्क कॉल नहीं स्थानीय कॉन्फ़िगरेशन (होस्ट फ़ाइल, आदि) का अनुसरण करता है
dns.resolve*(), dns.reverse() वास्तविक नेटवर्क अनुरोध करता है DNS सर्वर से कनेक्ट करते समय स्थानीय कॉन्फ़िगरेशन, प्रत्यक्ष DNS क्वेरीज़ से बचा जाता है

⚠️चेतावनी:

इन अंतरों के कारण, dns.lookup() और dns.resolve*() तरीकों के परिणाम हमेशा मेल नहीं खा सकते हैं, खासकर कस्टम होस्ट कॉन्फ़िगरेशन वाले वातावरण में।

3. त्रुटि प्रबंधन और पुनः प्रयास

मजबूत डीएनएस हेरफेर के लिए उचित त्रुटि प्रबंधन की आवश्यकता होती है। यहां सामान्य DNS त्रुटियों को संभालने और पुनः प्रयास तर्क को लागू करने का तरीका बताया गया है:

const dns = require('dns');

function lookupWithErrorHandling(domain) {
  dns.lookup(domain, (err, address, family) => {
    if (err) {
      console.error(`DNS lookup failed for ${domain}`);

      // Check specific error codes
      switch (err.code) {
        case 'ENOTFOUND':
          console.error(' Domain name not found');
          break;
        case 'ETIMEDOUT':
          console.error(' DNS lookup timed out');
          break;
        case 'ENODATA':
          console.error(' Domain exists but no data of requested type');
          break;
        case 'ESERVFAIL':
          console.error(' DNS server returned general failure');
          break;
        default:
          console.error(` Error code: ${err.code}`);
      }

      return;
    }

    console.log(`DNS lookup successful for ${domain}`);
    console.log(` IP address: ${address}`);
    console.log(` IP version: IPv${family}`);
  });
}

// Test with valid and invalid domains
lookupWithErrorHandling('www.google.com');
lookupWithErrorHandling('this-domain-does-not-exist-123456789.com');

💡नोट:

नेटवर्क समस्याओं या डीएनएस प्रसार में देरी के कारण डीएनएस त्रुटियां अस्थायी हो सकती हैं।

उत्पादन अनुप्रयोगों में, आप उच्च गति विलंब के साथ पुनः प्रयास तर्क लागू करना चाह सकते हैं।

प्रदर्शन अनुकूलन

डीएनएस लुकअप अनुप्रयोगों में एक प्रदर्शन बाधा हो सकता है। DNS रिज़ॉल्यूशन को बेहतर बनाने की रणनीतियाँ यहां दी गई हैं:

1. Caching

एक ही डोमेन के लिए बार-बार लुकअप से बचने के लिए एक सरल DNS कैश लागू करें:

const dns = require('dns');
const util = require('util');
const lookup = util.promisify(dns.lookup);
const dnsCache = new Map();

async function cachedLookup(domain) {
  if (dnsCache.has(domain)) {
    console.log('Cache hit for:', domain);
    return dnsCache.get(domain);
  }
  console.log('Cache miss for:', domain);
  const result = await lookup(domain);
  dnsCache.set(domain, result);
  return result;
}

// Example usage
(async () => {
  const domains = ['google.com', 'facebook.com', 'google.com'];
  for (const domain of domains) {
    const result = await cachedLookup(domain);
    console.log(`${domain} → ${result.address}`);
  }
})();

2. Parallel Lookups

समानांतर में एकाधिक DNS लुकअप निष्पादित करने के लिए Promise.all() का उपयोग करें:

const dns = require('dns').promises;

async function lookupMultiple(domains) {
  try {
    const lookups = domains.map(domain => dns.lookup(domain));
    const results = await Promise.all(lookups);
    return domains.map((domain, i) => ({
      domain,
      ...results[i]
    }));
  } catch (err) {
    console.error('One or more lookups failed:', err);
    throw err;
  }
}

// Example usage
lookupMultiple(['google.com', 'facebook.com', 'github.com'])
  .then(results => console.log(results))
  .catch(console.error);

3. कस्टम रिज़ॉल्वर और टाइमआउट

बेहतर नियंत्रण के लिए कस्टम DNS सर्वर और टाइमआउट कॉन्फ़िगर करें:

const dns = require('dns');
const { Resolver } = dns;

// Create a custom resolver with timeout
const resolver = new Resolver();
resolver.setServers(['8.8.8.8', '1.1.1.1']); // Google and Cloudflare DNS

// Set timeout for all operations (in ms)
const TIMEOUT = 2000;

async function resolveWithTimeout(domain, rrtype = 'A') {
  return new Promise((resolve, reject) => {
    const timer = setTimeout(() => {
      reject(new Error(`DNS query timed out after ${TIMEOUT}ms`));
    }, TIMEOUT);

    resolver.resolve(domain, rrtype, (err, addresses) => {
      clearTimeout(timer);
      if (err) return reject(err);
      resolve(addresses);
    });
  });
}

// Example usage
resolveWithTimeout('example.com')
  .then(console.log)
  .catch(console.error);

डीएनएस मॉड्यूल बनाम तृतीय-पक्ष डीएनएस लाइब्रेरी

विशेषता Node.js DNS तृतीय-पक्ष पुस्तकालय
इंस्टालेशन अंतर्निहित, कोई निर्भरता नहीं स्थापना एवं प्रबंधन आवश्यक
फ़ीचर सेट बुनियादी डीएनएस फ़ंक्शंस अक्सर बहुत विस्तृत
Caching कॉन्फ़िगर नहीं किया गया अधिकतर कैशिंग शामिल है
उन्नत विशेषताएँ परिभाषित इसमें DNSSEC, DoH, DoT समर्थन शामिल हो सकता है
प्रदर्शन बुनियादी उपयोग के लिए अच्छा है विशिष्ट उपयोग के मामलों के लिए अनुकूलित किया जा सकता है

Node.js third-party DNS :

सारांश

Node.js DNS . :

डोमेन नाम को आईपी पते के रूप में देखना

डोमेन नामों को आईपी पतों में हल करना

विभिन्न DNS रिकॉर्ड प्रकारों का निर्धारण

ए, एएएए, एमएक्स, टीएक्सटी, आदि

हेडर के अंतर्गत DNS लुकअप सक्षम करना

आईपी ​​पते को डोमेन नाम के रूप में हल करना

विशिष्ट सेटिंग्स के साथ कस्टम रिज़ॉल्वर बनाना

वैकल्पिक DNS सर्वर और सेटिंग्स

दो एपीआई

कॉलबैक-आधारित और वादा-आधारित

DNS मॉड्यूल को समझना उन अनुप्रयोगों के लिए महत्वपूर्ण है जिन्हें डोमेन नाम द्वारा नेटवर्क संसाधनों के साथ संचार करने, कस्टम नाम रिज़ॉल्यूशन तर्क लागू करने या डोमेन से संबंधित जानकारी को सत्यापित करने की आवश्यकता होती है।

अभ्यास

उस मॉड्यूल का नाम चुनें जो डोमेन नाम सिस्टम (डीएनएस) के साथ काम करने के लिए कार्य प्रदान करता है।

HTTP ब्लॉक
✗ ग़लत! HTTP मॉड्यूल का उपयोग वेब अनुरोधों को संभालने के लिए किया जाता है, DNS कार्यक्षमता के लिए नहीं
एफएस वॉल्यूम
✗ ग़लत! एफएस मॉड्यूल का उपयोग फ़ाइल सिस्टम संचालन को संभालने के लिए किया जाता है, डीएनएस को नहीं
डीएनएस मॉड्यूल
✓ ठीक है! DNS मॉड्यूल उचित मॉड्यूल है जो डोमेन नाम सिस्टम (DNS) के साथ काम करने के लिए कार्य प्रदान करता है।
ओएस मॉड्यूल
✗ ग़लत! ओएस मॉड्यूल ऑपरेटिंग सिस्टम से संबंधित कार्य प्रदान करता है, डीएनएस से नहीं